約 5,607,270 件
https://w.atwiki.jp/abwiki/pages/34.html
ポインタとはメモリアクセスの手段。 主に文字列操作、参照渡しもどき、関数呼び出しのオーバーヘッド削減、 関数テーブル、メモリの動的確保 などに使うのが一般的。 Dim pp As *Byte これでppはByte型データを指すポインタができる。 同じように Dim pp As *Long でLong型を指すポインタが宣言できる。 特性 ポインタはメモリアドレスを保持するのと、指した先の値を取り出すことができる。 Dim h[100] As Byte Dim ppp As *Byte ppp = h これでpppはhの先頭アドレスを指している。 ppp[0]とかppp[2]とか添字を付けることで、指した先ppp[0]ならh[0]の、ppp[2]ならh[2]の値を取り出すことができる。 また、ppp[2]=5とか、代入もできる。 参照渡しもどき ABではByVal,ByRefで値渡し、参照渡しを切り替えることができるが、ポインタを使って参照渡しもどきを使うことができる。 値渡しでは引数(この場合pのアドレス)は変わらないが指す先の値は変えることができる。 Sub sexy(p As *Byte) p[0] = 0 End Sub
https://w.atwiki.jp/newclang/pages/21.html
11 :デフォルトの名無しさん:2010/04/13(火) 02 18 03 別に僕は今のC言語で問題ないんだけど 新しいのを作るとしたらポインタ、特に関数へのポインタを引数に取り、関数へのポインタを引数に取る関数へのポインタを返す関数へのポインタとかを美しく記述できる文法を切口にポインタに変わるアドレッシング方法を考えればいいとおもう int - p; int ()(void) - fp; int ()(int ()(void) -) - ()(int - ()(void) -) - fpp; ダメだ、読みにくい int (*(*fpp)(int (*)(void)))(int (*)(void)); そもそも関数ポインタに代わるなにか、高階関数とかあればよいのだろうか 12 :デフォルトの名無しさん:2010/04/13(火) 02 25 49 11 普通に関数ポインタをtypedefすれば良いんじゃない? 13 :デフォルトの名無しさん:2010/04/13(火) 02 26 51 11 そのための typedef。 14 :12:2010/04/13(火) 02 27 09 まぁ、関数ポインタを見やすくすること自体は良いと思うけど… 15 :デフォルトの名無しさん:2010/04/13(火) 02 44 25 ちょっとした思い付きなんだけどスコープ内にある関数なら、 第一引数と一致する型の変数から暗黙的に関数を呼べると以外と便利かも… ※javascriptのthisポイントみたいな感じで char *copy( char *src, *dst ); char *trim( char *src ); char *toupper( char *src ); p- copy(*dst)- trim()- toupper(); 16 :15:2010/04/13(火) 02 45 59 アホだ俺、もう寝よう…orz p- copy(*dst)- trim()- toupper(); × p- copy(dst)- trim()- toupper(); ○ 関数ポインタならDのfunctionやScalaの関数宣言が参考になると int function(int) fp; // fp は関数へのポインタ int delegate(int) dg; // dg は関数へのデリゲート val f (a Int,b Int)= Int = {(a Int,b Int)= a+b} がデリゲード val f (a Int,b Int)- Int が関数ポインタとか 15 C#の拡張メソッドね。 乱用すんなとは言われてるけど、なかなか便利。 関数リテラル、関数内関数ぐらいは問題なさげ クロージャは、無限エクステントなしでよければ問題なさげ それでもforeachみたいなのに渡す分には困らない 値として返せないけど
https://w.atwiki.jp/sevenlives/pages/495.html
ポインタ 読み:ぽいんた 英語:pointer 別名: 意味: ポインタとはなんらかの値を持つ変数に対し、位置情報から間接的に変数を操作する仕組みのこと。 ポインタをでメモリのアドレスを直接操作できることで細やかなハードウェア制御ができる反面、バッファ・オーバーランなどの危険性も秘めているので、比較的新しい言語ではこのポインタの機能を付けていない物が多い。 2015年10月02日 間接参照演算子? アドレス(メモリ) ポインタ型? ポインタ演算? アドレス演算子? シンボル 関数ポインタ? ヌルポインタ? ダングリング・ポインタ? バッファ・オーバーラン?
https://w.atwiki.jp/genshiken/pages/25.html
ポインタ ポインタとは ポインタとは、値のアドレスを保持するための変数です。 ポインタの宣言 ポインタ型を表すには、「*」を使います(*はクリーネスターとかいうこともあります)。 int * ptr_int; /* ptr_int は int 型の値へのアドレスを保持するポインタ */ int ** ptr_ptr_int; /* ptr_ptr_int は int 型のポインタのポインタ */ 値とアドレス すべての値にはアドレスが存在します。勿論ポインタにも存在します。 アドレスとはその値の存在する場所を表す整数値です。 アドレスを取り出すにはアドレス演算子「 」を使います。 int num = 0; int *ptr = num; アドレスのさしている値を取り出す時は、間接演算子「*」を使います。 *ptr = 1; /* num には 1 が代入される。ptr 自体は変化しない */ 関数ポインタ 関数のアドレスを保持するポインタを、関数ポインタと呼ぶ。 これにより、関数の実体を持ち運ぶことはできないが、それを擬似的に再現することができる。 (実体を持ち運ぶ必要性はほとんどの場合ないのでこれで充分) int 型の引数を取り、int 型を返す関数のポインタは以下のように宣言される。 int (*func_ptr)(int); 以下のように使用する。 int add_one(int n){ return n + 1; } int (*func_ptr)(int); func_ptr = add_one; int i = (*func_ptr)(1); /* i には 2 が代入される */ 関数のアドレスは、アドレス演算子を使わなくても得る事ができる。 また、関数ポインタ越しに関数を呼ぶこともできるため、上のコードは以下のように書き換えることができる。 func_ptr = add_one; int i = func_ptr(1); 初心者は分からなくてもいいです。 ゲームプログラミングにおいては、タスクシステムなどで使用することはあるものの、なければならないということはないです。
https://w.atwiki.jp/gamexprogram/pages/43.html
C言語 ポインタ3 3回目は、構造体を使ってポインタを説明します。 例文 //================================================ //include //================================================ #include stdio.h //================================================ //define //================================================ #define P_AT 4 //自分の攻撃力 #define P_DEF 2//自分の防御力 #define E_AT 2//敵の攻撃力 #define E_DEF 1//敵の防御力 //================================================ //struct //================================================ struct tagChara { char *name;//名前 int attack;//攻撃力 int defence;//防御力 }; //================================================ //関数のプロトタイプ宣言 //================================================ void SetStatus(struct tagChara *chara, char *name, int attack, int defence);//ステータスのセット void DispStatus(struct tagChara *chara);//ステータスの表示 //================================================ //メイン関数 //================================================ int main(void) { /*構造体変数の宣言*/ struct tagChara player; struct tagChara enemy; /*ステータスセット*/ SetStatus( player, "勇者", P_AT, P_DEF); SetStatus( enemy, "モンスター", E_AT, E_DEF); /*ステータスの表示*/ DispStatus( player); DispStatus( enemy); return 0; } //================================================ //ステータスセット //================================================ void SetStatus(struct tagChara *chara, char *name, int attack, int defence) { chara- name = name; chara- attack = attack; chara- defence = defence; } //=============================================== //ステータスの表示 //=============================================== void DispStatus(struct tagChara *chara) { printf("%s \t", chara- name); printf("attack %d\t", chara- attack); printf("defence %d\n", chara- defence); } 実行結果 解説 void SetStatus(struct tagChara *chara, char *name, int attack, int defence);//ステータスのセット 構造体をポインタにして、関数のプロトタイプ宣言をしています。 SetStatus( player, "勇者", P_AT, P_DEF); ステータスの設定をしています。 SetStatusの最初の引数は、構造体のポインタのため、 をつけています。 では実際に、関数の中身を見て行きましょう。 chara- name = name; chara- attack = attack; chara- defence = defence; 構造体ポインタの変数に、引数として指定したもの を代入しています。 構造体ポインタを代入するときは、上記の通り をつけるか、 (*chara).nameという風にします。 DispStatusも同じような感じです。 とりあえず、ポインタの回は以上です。 大変複雑で難しいですが、一度使い方さえ 抑えてしまえば、何とかなると思います。 C言語に戻る
https://w.atwiki.jp/projecthikky/pages/41.html
C言語のメモ このページを編集 C言語 入門 入出力 もっとも一般的な方法としてC言語標準ライブラリを利用する。 int putchar(int c) // putc(c,stdout)と同じ int getchar(void) // getc(stdin)と同じ stdout, stdin, stderr ファイルはプログラム実行時に自動的に開かれるため、明示的に開く必要はない。 手元の環境で stdout, stdin, stderr は /dev/std... にシンボリックリンクとしてあった。 関数プロトタイプを見てわかる通り戻り値、引数は int すなわちデータブロックのインターフェイスになる。 ディレクトリ操作(Windows) コンソール操作Unix系(curses, ncurses) Windows(PDCurses) Windows(conio, wincon) 記憶クラス指定子(extern, auto, register, static, typedef) 配列の初期化 組み込みのアルゴリズム実装バイナリサーチ(二分木探索)bsearch クイックソート(高速整列) qsort ディレクトリ操作(Windows) ディレクトリ操作(Windows) コンソール操作 Unix系(curses, ncurses) コンソール上でグラフィカルな操作ができる curses - Wikipedia http //ja.wikipedia.org/wiki/Curses ncurses - Wikipedia http //ja.wikipedia.org/wiki/Ncurses Windows(PDCurses) Windows用のCurses オープンソースのソースコードで自由に改変して使える LinuxのCursesを使ったプログラムの移植などをしやすいのでよく使われている Public Domain Curses http //pdcurses.sourceforge.net/ Windows(conio, wincon) 一部のWindowsのCコンパイラに付属してるライブラリ conio (コンソールIO)。conio.hをインクルードして使う。 (注意:Cの標準規格のライブラリではないので実装は様々、各コンパイラごとに挙動が違う。) もしくはコンソール用Win32APIのwincon.hをインクルードして使う(これは色々行える、ライブラリは kernel32.lib) 詳細は各コンパイラのconioライブラリやコンソール用Win32APIのドキュメントを読むべし。 Conio.h http //en.wikipedia.org/wiki/Conio.h コンソールWin32API http //msdn.microsoft.com/ja-jp/library/cc429123.aspx コンソールWin32APIの使い方 http //eternalwindows.jp/windevelop/console/console00.html 記憶クラス指定子(extern, auto, register, static, typedef) 記憶クラス指定子 配列の初期化 配列の初期化 組み込みのアルゴリズム実装 バイナリサーチ(二分木探索)bsearch たぶんきっと高速だろう 任意の型の配列を探索できる クイックソート(高速整列) qsort たぶんきっと高速だろう クイックソートは安定ソートでは無いから注意 任意の型の配列を整列できる
https://w.atwiki.jp/gamexprogram/pages/42.html
C言語 ポインタ2 2回目は、関数を使ってポインタを説明します。 例文 //================================================ //include //================================================ #include stdio.h //================================================ //struct //================================================ struct tagChara { int attack;//攻撃力 int defence;//防御力 }; //================================================ //関数のプロトタイプ宣言 //================================================ void SetStatus(int *attack, int *defence);//ステータスセット //================================================ //メイン関数 //================================================ int main(void) { struct tagChara player; /*ステータスセット*/ SetStatus( player.attack, player.defence); printf("攻撃力 %d\t", player.attack); printf("防御力 %d", player.defence); return 0; } //================================================ //ステータスセット //================================================ void SetStatus(int *attack, int *defence) { printf("攻撃力を入力せよ"); scanf("%d", attack); printf("防御力を入力せよ"); scanf("%d", defence); } 実行結果 解説 void SetStatus(int *attack, int *defence); 引数がポインタの関数のプロトタイプ宣言をしています。 こうしないと、正確な値が出ません(確認済) SetStatus( player.attack, player.defence); 関数の使用です。 ポインタを参照するため、 をつけてください。 scanf("%d", attack); このscanfですが、少し違うところがあります。 それは がついていないところです。 これは、前回のポインタの説明に関係してきます。 前回 ポインタ 数値 *を前につける アドレス 何も付けない と書いたと思います。 その関係で、アドレスを参照するときには何もいらないのです。 C言語に戻る
https://w.atwiki.jp/cschola/pages/73.html
結構長いですが、C言語の中核をなす大事な部分です。 何度も繰り返し学習して、自分のものにしましょう。 第1項 ポインタ 今回はポインタについて説明します。ポインタとは「メモリ」上の「アドレス」を格納できる変数です。 「メモリ」とはPCの記憶領域です。 「アドレス」は「場所を示す」ものです。住所や郵便番号のようなものです。 「メールアドレス」といえばメールの行きつく「場所を示す」ものですね。 前回までのプログラムで変数を使ってきました。 変数を宣言するとその変数の型の大きさのに合わせた領域が「メモリ」上に確保されます。 「メモリ」上のどの場所が確保されるのかはわかりません。 使える場所をコンピュータが適当に選んで割り当てます。 「メモリ」上のどの場所に割り当てられたのか、それを示すのがアドレスです。 アドレスを見る 次のプログラムを書いて、実行する前に今まで書いてきたプログラムとの違いを探してみましょう。 int num = 10; printf("numの値は%dです。\n",num); printf("numのアドレスは%pです。\n", num); 実行してみると上一行には今までと同じように num の値が表示され、 下の一行には数字とアルファベットが表示されています。 これは16進数で示されるアドレスです。 メモリ上のどの場所にデータが格納されているのか示します。 変数は必ずアドレスを持っていて、変数名の前に を付けることでその変数のアドレスを得ることができます。 double型 や char型の変数もアドレスを持っています。 練習問題 次のようなプログラムを作ってください。 第1問 double型の変数を宣言して、そのアドレスを表示する。 第2問 char型の変数を宣言して、そのアドレスを表示する。 第二項 アドレスを格納する変数 前項で画面に表示したアドレスは変数に格納することができます。 アドレスを格納する変数をポインターといいます。 ポインターは次のように宣言します。 int num = 0; //int型変数numの宣言 int* p = num; //int型ポインターの p を宣言 今回は int型の num のアドレスを格納しています。 ポインターは 格納したい変数の型に * を付けて宣言します。 * の位置は int* p でも int *p でも宣言できます。 double型 の変数のアドレスを格納したい場合は double* と書きます。 char型も同様です。 ポインターに変数のアドレスを格納すると、ポインターからその変数にアクセスできるようになります。 ポインターの名前に * を付けることでアクセスできます。 int num = 0; int* p = num; printf("numの値は%d\n",num); *p = 10; //pからnumにアクセスしてnumの値を変更 printf("numの値は%d\n",num); //numの値を表示 printf("numの値は%d\n",*p); //pからnumにアクセスして numの値を表示 printf("numのアドレスは%p\n",p); この使い方は double型 や char型でも同じです。 ポインターは、 int* p = num; のように宣言と同時に初期化しましょう。 初期化していないポインターはどこのアドレスを指しているかわからず、危険なふるまいをする可能性があります。 練習問題 次のようなプログラムを作ってください。 第1問 double型の変数を宣言し、そのアドレスをポインターに格納して、 ポインターから変数にアクセスして数値を代入し表示する。 第2問 char型の変数を宣言し、そのアドレスをポインターに格納して、 ポインターから変数にアクセスして文字を代入し、ポインターから参照して表示する。
https://w.atwiki.jp/air-lang/pages/53.html
(事前定義済みの)ファイルポインタ 名前 別名 意味 STDIN stdin 標準入力 STDOUT stdout 標準出力 STDERR stderr 標準エラー出力 DATA data スクリプトプログラム内の埋め込みデータ読み込み用 ※ ※スクリプトプログラム内に埋め込みデータが存在する時のみ有効。それ以外は無効(未定義)。 埋め込みデータの開始は __DATA__ __data__ D[ATA] d[ata] のいずれかで指定する。 ans=0 while(str=gets(DATA)){ # __DATA__ 以降を1行ずつ読み込み、変数 str に代入します。 ans+=int(str) # その内容を整数に変換して変数 ans に加算します。 } print("Answer=%d\n",ans) # Answer=603 が表示されます。 __DATA__ 100 200 303 (一般ファイルの)ファイルポインタ ファイル名(の文字列)を保持する変数を、ファイルポインタと見なしてファイルI/Oを実行して下さい。 正確な(内部的な)ファイルポインタの取扱いは、以下の通りです。 最初のファイルI/O実行時には、対象ファイルが自動的にオープンされ、オープンされたファイルポインタが元の変数の専用領域にセットされます。そして、そのファイルポインタを用いて最初のファイルI/Oが実行されます。 2回目以降は、元の変数が既に持っている(オープン状態にある)ファイルポインタを用いてファイルI/Oが実行されます。 fname="/etc/passwd" # ファイル名を文字列で変数 fname にセットします。 while(str=gets(fname)){ # 対象ファイルをオープンし1行ずつ読み込み変数 str に代入します。 puts(str) # その内容を表示します。 }
https://w.atwiki.jp/gamexprogram/pages/41.html
C言語 ポインタ1 C言語で最大の難関と言われるポインタです。 使用方法 データ型 *変数名; 変数前に*(アスタリスク)をつけることでポインタを指します。 例文 //================================================ //include //================================================ #include stdio.h //================================================ //メイン関数 //================================================ int main(void) { int a = 1; int *p; p = a;//ポインタにアドレスを入れる printf("aの変数のアドレスは%p\n", a); printf("aの変数内の数値は%d\n", a); printf("pの変数のアドレスは%p\n", p); printf("pの変数内の数値は%d", *p); return 0; } 実行結果 解説 int *p; pという名前のポインタを宣言しています。 p = a; ポインタのアドレスを代入しています。 printf("aの変数のアドレスは%p\n", a); %pはアドレスを表示させるものです。 そして、アドレスを示すので変数の前に をつけています。 printf("pの変数のアドレスは%p\n", p); printf("pの変数内の数値は%d", *p); ポインタにアドレスを入れた場合は、数値とアドレスを 見る方法が変わります。 アドレスの場合は、前に何も付けずに、 数値の場合は、*を付けています。 ややこしいので、少し表にしてみました。 普通の変数の場合 数値 何も付けない アドレス 前に ポインタの場合 数値 前に* アドレス 何も付けない C言語に戻る